package com.bone.config;

import com.bone.common.constant.Dict;
import com.github.xiaoymin.swaggerbootstrapui.annotations.EnableSwaggerBootstrapUI;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.ParameterBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.schema.ModelRef;
import springfox.documentation.service.*;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

/**
  *
  * @author : WangKeKe
  * @date : 2020/8/22 17:32
  * Description : swagger配置类
  *
*/


@Slf4j
@Configuration
@EnableSwagger2
@EnableSwaggerBootstrapUI
public class SwaggerConfig implements WebMvcConfigurer {

   /**
    *
    * 显示swagger-ui.html文档展示页，还必须注入swagger资源：
    *
    * @param registry
    */
   @Override
   public void addResourceHandlers(ResourceHandlerRegistry registry) {
       registry.addResourceHandler("swagger-ui.html").addResourceLocations("classpath:/META-INF/resources/");
       registry.addResourceHandler("doc.html").addResourceLocations("classpath:/META-INF/resources/");
       registry.addResourceHandler("/webjars/**").addResourceLocations("classpath:/META-INF/resources/webjars/");
   }

   /**
    * swagger2的配置文件，这里可以配置swagger2的一些基本的内容，比如扫描的包等等
    *
    * @return Docket
    */
   @Bean
   public Docket createRestApi() {
       return new Docket(DocumentationType.SWAGGER_2)
               .groupName("bone-System")
               .apiInfo(apiInfo())
               .select()
               //此包路径下的类，才生成接口文档
               .apis(RequestHandlerSelectors.basePackage("com.bone.modules"))
               //加了ApiOperation注解的类，才生成接口文档
               .apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class))
               .paths(PathSelectors.any())
               .build()
               .securitySchemes(Collections.singletonList(securityScheme()));
       //.globalOperationParameters(setHeaderToken());
   }

   /***
    * oauth2配置
    * 需要增加swagger授权回调地址
    * http://localhost:8888/webjars/springfox-swagger-ui/o2c.html
    * @return
    */
   @Bean
   SecurityScheme securityScheme() {
       return new ApiKey(Dict.X_ACCESS_TOKEN, Dict.X_ACCESS_TOKEN, "header");
   }
   /**
    * JWT token
    * @return
    */
   private List<Parameter> setHeaderToken() {
       ParameterBuilder tokenPar = new ParameterBuilder();
       List<Parameter> pars = new ArrayList<>();
       tokenPar.name(Dict.X_ACCESS_TOKEN).description("token").modelRef(new ModelRef("string")).parameterType("header").required(false).build();
       pars.add(tokenPar.build());
       return pars;
   }

   /**
    * api文档的详细信息函数,注意这里的注解引用的是哪个
    *
    * @return
    */
   private ApiInfo apiInfo() {

       return new ApiInfoBuilder()
               // //大标题
               .title("my-bone 后台服务API接口文档")
               // 版本号
               .version("1.0")
               // 描述
               .description("后台API接口")
               // 作者
               .contact(new Contact("王可可","http://localhost:8080/nobug","976493753@qq.com"))
               .license("The Apache License, Version 2.0")
               .licenseUrl("http://www.apache.org/licenses/LICENSE-2.0.html")
               .build();
   }

}
